package com.jian.myutils;

import android.content.Context;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

/**
 * 处理位置信息
 * 
 * @author abreal
 * 
 */
public class LocationHandler implements BDLocationListener {

    /**
     * 响应获取位置Listener
     * 
     * @author abreal
     * 
     */
    public interface LocationResultListener {
	/**
	 * 响应获取到经纬度
	 * 
	 * @param dLongitude
	 *            经度
	 * @param dLatitude
	 *            纬度
	 */
	void onGetLocation(double dLongitude, double dLatitude);

	/**
	 * 响应获取到位置地址信息
	 * 
	 * @param strAddress
	 */
	void onGetLocationAddress(String strAddress);
    }

    // private final String TAG = "LocationHandler";
    private LocationClient m_lcBaidu = null;
    // 回调对象，将获取到的位置信息传递出去
    private LocationResultListener m_resultListener;

    /**
     * constructor
     * 
     * @param context
     */
    public LocationHandler(Context context) {
	LocationClientOption option = new LocationClientOption();
	option.setOpenGps(true);
	option.setCoorType("bd09ll");
	option.setAddrType("all");
	option.setScanSpan(100); // 一次定位
	m_lcBaidu = new LocationClient(context, option);
	m_lcBaidu.registerLocationListener(this);

    }

    /**
     * 设置获取到位置信信息后，回调listener
     * 
     * @param listener
     */
    public void setResultListener(LocationResultListener listener) {
	m_resultListener = listener;
    }

    /**
     * 更新位置信息
     */
    public void updateLocation() {
	if (null != m_lcBaidu) {
	    if (m_lcBaidu.isStarted()) {
		m_lcBaidu.requestLocation();
	    } else {
		m_lcBaidu.start();
		Log.d("boot", "locClient is null or not started");
	    }
	}
    }

    public void cleanUp() {
	if (null != m_lcBaidu) {
	    m_lcBaidu.stop();
	    m_lcBaidu = null;
	}
	if (null != m_resultListener) {
	    m_resultListener = null;
	}
    }

    public void stop() {
	if (null != m_lcBaidu) {
	    m_lcBaidu.stop();
	}
    }

    @Override
    public void onReceiveLocation(BDLocation loc) {
	if (null != m_resultListener) {
	    m_resultListener.onGetLocation(loc.getLongitude(),
		    loc.getLatitude());
	    m_resultListener.onGetLocationAddress(loc.getAddrStr());
	}
    }

    @Override
    public void onReceivePoi(BDLocation loc) {
    }

}
//
// class oldLocationHandler {
// private final String TAG = "LocationHandler";
//
// private class CellIDInfo {
//
// public int cellId;
// public String mobileCountryCode;
// public String mobileNetworkCode;
// public int locationAreaCode;
// public String radioType;
//
// public CellIDInfo() {
// }
// }
//
// private LocationManager m_locationManager;
// private TelephonyManager m_telephonyMgr;
// private ConnectivityManager m_connectivityMgr;
//
// double m_dLongitude = 0.0; // 经度
// double m_dLatitude = 0.0; // 纬度
// // 回调对象，将获取到的位置信息传递出去
// LocationResultListener m_resultListener;
//
// /**
// * constructor
// *
// * @param context
// */
// public oldLocationHandler(Context context) {
// m_locationManager = (LocationManager) context
// .getSystemService(Context.LOCATION_SERVICE);
// m_telephonyMgr = (TelephonyManager) context
// .getSystemService(Context.TELEPHONY_SERVICE);
// m_connectivityMgr = (ConnectivityManager) context
// .getSystemService(Context.CONNECTIVITY_SERVICE);
// }
//
// /**
// * 设置获取到位置信信息后，回调listener
// *
// * @param listener
// */
// public void setResultListener(LocationResultListener listener) {
// m_resultListener = listener;
// }
//
// /**
// * 更新位置信息
// */
// public void updateLocation() {
// new Thread(new Runnable() {
// public void run() {
// doUpdateLocation();
// }
// }).start();
// }
//
// protected void doUpdateLocation() {
// if (checkNetworkState()) {
// Looper.prepare();
// if (!updateCellLocation()) {
// if (m_locationManager
// .isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
// Location location = m_locationManager
// .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
// if (location != null) {
// m_dLatitude = location.getLatitude();
// m_dLongitude = location.getLongitude();
// onGetLocation(m_dLongitude, m_dLatitude);
// updateLocationInfo();
// } else {
// try {
// m_locationManager.requestLocationUpdates(
// LocationManager.NETWORK_PROVIDER, 60000, 0,
// this);
// } catch (IllegalArgumentException e) {
// Log.e(TAG,
// "Request network location error,"
// + e.getMessage());
// }
// }
// } else {
// // 启用了GPS
// m_locationManager.requestLocationUpdates(
// LocationManager.GPS_PROVIDER, 60000, 0, this);
//
// }
// }
// } else {
// Log.w(TAG, "Network no enabled!");
// }
// }
//
// /**
// * 基于基站的定位
// */
// private boolean updateCellLocation() {
// // GsmCellLocation cellLocation =
// // (GsmCellLocation)m_TelephonyMgr.getCellLocation();
//
// int type = m_telephonyMgr.getNetworkType();
// // 在中国，移动的2G是EGDE，联通的2G为GPRS，电信的2G为CDMA，电信的3G为EVDO
// // String OperatorName = tm.getNetworkOperatorName();
// Location loc = null;
// ArrayList<CellIDInfo> CellID = new ArrayList<CellIDInfo>();
// // 中国电信为CTC
// // NETWORK_TYPE_EVDO_A是中国电信3G的getNetworkType
// // NETWORK_TYPE_CDMA电信2G是CDMA
// if (type == TelephonyManager.NETWORK_TYPE_EVDO_A
// || type == TelephonyManager.NETWORK_TYPE_CDMA
// || type == TelephonyManager.NETWORK_TYPE_1xRTT) {
// CdmaCellLocation location = (CdmaCellLocation) m_telephonyMgr
// .getCellLocation();
// int cellIDs = location.getBaseStationId();
// int networkID = location.getNetworkId();
// StringBuilder nsb = new StringBuilder();
// nsb.append(location.getSystemId());
// CellIDInfo info = new CellIDInfo();
// info.cellId = cellIDs;
// info.locationAreaCode = networkID; // ok
// info.mobileNetworkCode = nsb.toString();
// info.mobileCountryCode = m_telephonyMgr.getNetworkOperator()
// .substring(0, 3);
// info.radioType = "cdma";
// CellID.add(info);
// }
// // 移动2G卡 + CMCC + 2
// // type = NETWORK_TYPE_EDGE
// else if (type == TelephonyManager.NETWORK_TYPE_EDGE) {
// GsmCellLocation location = (GsmCellLocation) m_telephonyMgr
// .getCellLocation();
// int cellIDs = location.getCid();
// int lac = location.getLac();
// CellIDInfo info = new CellIDInfo();
// info.cellId = cellIDs;
// info.locationAreaCode = lac;
// info.mobileNetworkCode = m_telephonyMgr.getNetworkOperator()
// .substring(3, 5);
// info.mobileCountryCode = m_telephonyMgr.getNetworkOperator()
// .substring(0, 3);
// info.radioType = "gsm";
// CellID.add(info);
// }
// // 联通的2G经过测试 China Unicom 1 NETWORK_TYPE_GPRS
// else if (type == TelephonyManager.NETWORK_TYPE_GPRS) {
//
// GsmCellLocation location = (GsmCellLocation) m_telephonyMgr
// .getCellLocation();
// int cellIDs = location.getCid();
// int lac = location.getLac();
// CellIDInfo info = new CellIDInfo();
// info.cellId = cellIDs;
// info.locationAreaCode = lac;
// // 经过测试，获取联通数据以下两行必须去掉，否则会出现错误，错误类型为JSON Parsing Error
// // info.mobileNetworkCode =
// // tm.getNetworkOperator().substring(3, 5);
// // info.mobileCountryCode =
// // tm.getNetworkOperator().substring(0, 3);
// info.radioType = "gsm";
// CellID.add(info);
// } else {
// Log.d(TAG, "Not support cell network type:" + type);
// }
//
// loc = callGear(CellID);
// if (null != loc) {
// this.m_dLongitude = loc.getLongitude();
// this.m_dLatitude = loc.getLatitude();
// onGetLocation(m_dLongitude, m_dLatitude);
// updateLocationInfo();
// return true;
// } else {
// return false;
// }
// }
//
// /**
// * 根据cell信息，获取位置
// *
// * @param cellID
// * @return
// */
// private Location callGear(ArrayList<CellIDInfo> cellID) {
// if (cellID == null || cellID.size() <= 0)
// return null;
// DefaultHttpClient client = new DefaultHttpClient();
// HttpPost post = new HttpPost("http://www.google.cn/loc/json");
// JSONObject holder = new JSONObject();
// try {
// holder.put("version", "1.1.0");
// holder.put("host", "maps.google.com");
// holder.put("home_mobile_country_code",
// cellID.get(0).mobileCountryCode);
// holder.put("home_mobile_network_code",
// cellID.get(0).mobileNetworkCode);
// holder.put("radio_type", cellID.get(0).radioType);
// holder.put("request_address", true);
// if ("460".equals(cellID.get(0).mobileCountryCode))
// holder.put("address_language", "zh_CN");
// else
// holder.put("address_language", "en_US");
// JSONObject data, current_data;
// JSONArray array = new JSONArray();
// current_data = new JSONObject();
// current_data.put("cell_id", cellID.get(0).cellId);
// current_data.put("location_area_code",
// cellID.get(0).locationAreaCode);
// current_data.put("mobile_country_code",
// cellID.get(0).mobileCountryCode);
// current_data.put("mobile_network_code",
// cellID.get(0).mobileNetworkCode);
// current_data.put("age", 0);
// array.put(current_data);
// if (cellID.size() > 2) {
// for (int i = 1; i < cellID.size(); i++) {
// data = new JSONObject();
// data.put("cell_id", cellID.get(i).cellId);
// data.put("location_area_code",
// cellID.get(i).locationAreaCode);
// data.put("mobile_country_code",
// cellID.get(i).mobileCountryCode);
// data.put("mobile_network_code",
// cellID.get(i).mobileNetworkCode);
// data.put("age", 0);
// array.put(data);
// }
// }
// holder.put("cell_towers", array);
// StringEntity se = new StringEntity(holder.toString());
// // Log.e("Location send", holder.toString());
// post.setEntity(se);
// HttpResponse resp = client.execute(post);
// HttpEntity entity = resp.getEntity();
//
// BufferedReader br = new BufferedReader(new InputStreamReader(
// entity.getContent()));
// StringBuffer sb = new StringBuffer();
// String result = br.readLine();
// while (result != null) {
// // Log.e("Locaiton receive", result);
// sb.append(result);
// result = br.readLine();
// }
// if (sb.length() <= 1)
// return null;
// data = new JSONObject(sb.toString());
// data = (JSONObject) data.get("location");
//
// Location loc = new Location(LocationManager.NETWORK_PROVIDER);
// loc.setLatitude((Double) data.get("latitude"));
// loc.setLongitude((Double) data.get("longitude"));
// loc.setAccuracy(Float.parseFloat(data.get("accuracy").toString()));
// // loc.setTime(GetUTCTime());
// return loc;
// } catch (JSONException e) {
// return null;
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// } catch (ClientProtocolException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
// return null;
// }
//
// /*
// * 当坐标改变时触发此函数，如果Provider传进相同的坐标，它就不会被触发
// *
// * @see
// * android.location.LocationListener#onLocationChanged(android.location.
// * Location)
// */
// @Override
// public void onLocationChanged(Location location) {
// if (location != null) {
// m_dLatitude = location.getLatitude();
// m_dLongitude = location.getLongitude();
// updateLocationInfo();
// }
// }
//
// /*
// * Provider被disable时触发此函数，比如GPS被关闭
// *
// * @see
// * android.location.LocationListener#onProviderDisabled(java.lang.String)
// */
// @Override
// public void onProviderDisabled(String provider) {
// }
//
// /*
// * Provider被enable时触发此函数，比如GPS被打开
// *
// * @see
// * android.location.LocationListener#onProviderEnabled(java.lang.String)
// */
// @Override
// public void onProviderEnabled(String provider) {
// }
//
// /*
// * Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
// *
// * @see android.location.LocationListener#onStatusChanged(java.lang.String,
// * int, android.os.Bundle)
// */
// @Override
// public void onStatusChanged(String provider, int status, Bundle extras) {
//
// }
//
// /**
// * 根据经纬度查询到具体地理信息
// */
// private void updateLocationInfo() {
// // Log.e(TAG, "获取位置信息 : 经度: " + longitude + " 纬度: " + latitude);
// String strUrl = String
// .format("http://maps.google.cn/maps/api/geocode/json?latlng=%f,%f&sensor=true&language=zh-CN",
// m_dLatitude, m_dLongitude);
// HttpGet request = new HttpGet(strUrl);
// // 发送请求
// try {
// HttpResponse httpResponse = new DefaultHttpClient()
// .execute(request);
// // 得到应答的字符串，这也是一个 JSON 格式保存的数据
// String retSrc = EntityUtils.toString(httpResponse.getEntity());
// // 生成 JSON 对象
// try {
// JSONObject result = new JSONObject(retSrc);
// JSONArray jaResults = result.getJSONArray("results");
// if (null != jaResults) {
// Log.d(TAG, "resultsJA len:" + jaResults.length());
// JSONObject joTypeRoute = jaResults.getJSONObject(0);
// if (joTypeRoute != null) {
// final String strAddress = joTypeRoute
// .getString("formatted_address");
// Log.d(TAG, "Formatted address:" + strAddress);
// if (null != m_resultListener) {
// Utils.postMainHandlerMsg(new Runnable() {
//
// @Override
// public void run() {
// m_resultListener
// .onGetLocationAddress(strAddress);
// }
// });
// }
// }
// }
// result = null;
// } catch (JSONException e) {
// Log.e(TAG, "Parse json failed," + e.getMessage());
// e.printStackTrace();
// } catch (Exception e) {
// Log.e(TAG, "Parse json other failed," + e.getMessage());
// e.printStackTrace();
// }
// httpResponse = null;
// } catch (ClientProtocolException e) {
// Log.e(TAG, "Http response failed," + e.getMessage());
// e.printStackTrace();
//
// } catch (IOException e) {
// Log.e(TAG, "Http response failed," + e.getMessage());
// e.printStackTrace();
// }
// m_locationManager.removeUpdates(this); // FIXME:是否不断更新位置信息
// }
//
// /**
// * 检测是否打开网络
// */
// private boolean checkNetworkState() {
// NetworkInfo ni = m_connectivityMgr
// .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
// if (null != ni && ni.getState() == State.CONNECTED) {
// return true;
// } else {
// ni = m_connectivityMgr
// .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
// if (null != ni && ni.getState() == State.CONNECTED) {
// return true;
// } else {
// return false;
// }
// }
// }
//
// private void onGetLocation(final double dLongitude, final double dLatitude2)
// {
// if (null != m_resultListener) {
// Utils.postMainHandlerMsg(new Runnable() {
//
// @Override
// public void run() {
// m_resultListener.onGetLocation(m_dLongitude, m_dLatitude);
// }
// });
// }
// }
//
// }
